// 实体基础控制器 - 负责实体的行为逻辑
export abstract class EntityController {
    protected model: EntityModel;
    protected view: EntityView;
    protected stateMachine: StateMachine;
    
    constructor(model: EntityModel, view: EntityView) {
        this.model = model;
        this.view = view;
        this.stateMachine = new StateMachine(this);
        this.initStateMachine();
    }
    
    // 初始化状态机
    protected abstract initStateMachine(): void;
    
    // 更新
    public update(dt: number): void {
        // 更新状态机
        this.stateMachine.update(dt);
        
        // 更新视图位置
        this.updateViewPosition();
    }
    
    // 更新视图位置
    protected updateViewPosition(): void {
        if (this.view && this.model) {
            this.view.setPosition(this.model.position);
            this.view.setDirection(this.model.direction);
        }
    }
    
    // 移动
    public move(direction: cc.Vec2, speed: number): void {
        if (this.model.isDead) return;
        
        // 更新方向
        this.model.direction = direction.normalize();
        
        // 计算新位置
        const moveDistance = speed * this.model.attributes.getValue(AttributeType.SPEED);
        const newPosition = this.model.position.add(direction.mul(moveDistance));
        
        // 检查碰撞
        if (this.checkCollision(newPosition)) {
            this.model.position = newPosition;
        }
    }
    
    // 检查碰撞
    protected checkCollision(position: cc.Vec2): boolean {
        // 基础碰撞检测，可在子类中重写
        return true;
    }
    
    // 受到伤害
    public takeDamage(damage: number, source: EntityController): void {
        if (this.model.isDead) return;
        
        // 计算实际伤害
        const actualDamage = this.model.takeDamage(damage, source.getModel());
        
        // 显示伤害数字
        this.view.showDamageNumber(actualDamage);
        
        // 播放受击动画
        this.view.playHitAnimation();
        
        // 检查死亡
        if (this.model.isDead) {
            this.die(source);
        }
    }
    
    // 死亡
    protected die(killer: EntityController): void {
        // 播放死亡动画
        this.view.playDeathAnimation(() => {
            // 通知事件系统
            BattleCore.instance.getEventSystem().emit(
                BattleEvent.ENTITY_DIED, 
                this.model.id, 
                killer ? killer.getModel().id : 0
            );
            
            // 处理掉落
            this.handleDrops();
            
            // 移除实体
            this.destroy();
        });
    }
    
    // 处理掉落
    protected handleDrops(): void {
        // 基础实现，子类可重写
    }
    
    // 销毁
    public destroy(): void {
        // 移除视图
        if (this.view) {
            this.view.destroy();
        }
        
        // 移除模型
        BattleCore.instance.getEntityManager().removeEntity(this.model.id);
    }
    
    // 获取模型
    public getModel(): EntityModel {
        return this.model;
    }
    
    // 获取视图
    public getView(): EntityView {
        return this.view;
    }
}